package com.hjt.tools.date;

import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * @name DateCreater
 * @date 2012.10.12
 * @author huangjt
 * @introduction 生成日期和时间
 * */
public class DateCreator {

	public static final String DATE = "date";
	public static final String TIME = "time";
	public static final String DATE_TIME = "dateAndTime";
	public static final String TIME_DATA = "NoSymbolTime";

	/**
	 * @param style 返回的日期类型，默认为日期时间类型
	 * 有三种参数DATE，TIME，DATE_TIME，分别代表日期，
	 * 时间，日期和时间，默认可不写参数，为日期时间
	 * @return String 返回日期时间
	 * @introduction 有三种参数
	 * */
	public static String createDate(String... style) {
		Calendar c = Calendar.getInstance();
		c.setTimeInMillis(System.currentTimeMillis());
		Date d = c.getTime();
	
		if (0 < style.length) {
			if (style[0].equals(DATE)) {
				SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
				return sdf.format(d);

			}else if(style[0].equals(DATE_TIME)){
				SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
				return sdf.format(d);

			}else if(style[0].equals(TIME)){
				SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
				return sdf.format(d);
			}else if(style[0].equals(TIME_DATA)){
				SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
				return sdf.format(d);
			}else{
				SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
				return sdf.format(d);
			}

		}else {
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
			return sdf.format(d);
		}
	}
	
	/**
	 * 获得系统当前SQL格式的时间
	 * @return
	 */
	public static Timestamp getCurrentTime(){
		return shiftSQLTime(createDate());
	}
	
	/**
	 * DATE转换成string
	 * @author huangjt
	 * @param date
	 * @param style
	 * @return
	 */
	public static String getDate2String(Date date, String style){
		if(date == null){
			return "";
		}
		SimpleDateFormat sdf=new SimpleDateFormat(style);  
		return sdf.format(date);  
	}
	
	/**
	 * 转换成sql需要的格式
	 * @param dateString	转换时间
	 * @param style	转换格式
	 * @return
	 */
	public static Timestamp shiftSQLTime(String dateString, String... style){
		
		DateFormat dateFormat;
		
		if (0 < style.length) {
			if (style[0].equals(DATE)) {
				dateFormat = new SimpleDateFormat("yyyy-MM-dd");
			}else if(style[0].equals(DATE_TIME)){
				dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
			}else if(style[0].equals(TIME)){
				dateFormat = new SimpleDateFormat("HH:mm:ss");
			}else{
				dateFormat = new SimpleDateFormat("yyyy-MM-dd");
			}
		}else {
			dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		}
		
		dateFormat.setLenient(false);
		java.util.Date timeDate = null;
		try {
			timeDate = dateFormat.parse(dateString);	//util类型	
		} catch (ParseException e) {
			e.printStackTrace();
		}
		java.sql.Timestamp dateTime = new java.sql.Timestamp(timeDate.getTime());	
		return dateTime;
	}
	
	/** 
	 * @author huangjt
     * 获得过去几天前或几天后的日期 
     * 格式为 yyyy-MM-dd HH:mm:ss
     * @param days 负为几天前, 正为几天后 
     * @return 
     */  
    public static String getNextDay(Long days) {  
        
    	SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
        String dt = sdf.format(new Date(new Date().getTime()+days*1000*3600*24));  
        return dt;  
    } 
    
	/** 
	 * @author huangjt
     * 获得过去几天前或几天后的日期 
     * 格式为 yyyy-MM-dd HH:mm:ss
     * @param days 负为几天前, 正为几天后 
     * @return 
     */  
    public static String getNextDay(Long days, String style) {  
        
    	SimpleDateFormat sdf = new SimpleDateFormat(style);  
        String dt = sdf.format(new Date(new Date().getTime()+days*1000*3600*24));  
        return dt;  
    } 
    
	/** 
	 * @author huangjt
     * 获得过去几天前或几天后的日期 
     * 格式为 yyyy-MM-dd HH:mm:ss
     * @param days 负为几天前, 正为几天后 
     * @return 
	 * @throws ParseException 
     */  
    public static String getNextDay(String day, Long days, String style) throws ParseException {  
        
    	SimpleDateFormat sdf = new SimpleDateFormat(style);  
        String dt = sdf.format(new Date(String2Date(day).getTime()+days*1000*3600*24));  
        return dt;  
    } 
    
    /**
     * 获取当前日期的以字符串格式的形式 如获得的是 20130910 格式的
     * @author huangjt<br/>
     * date 2013-9-10<br/>
     * @param days 负为几天前, 正为几天后  ， 0为当天
     * @return
     */
    public static String getStringTypeDateTime(Long days){
    	SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");  
        String dt = sdf.format(new Date(new Date().getTime()+days*1000*3600*24));  
    	return dt;
    }
    
    /**
     * 将Timestamp转化为 String
     * @author huangjt<br/>
     * date 2013-5-21<br/>
     * @param timestamp
     * @return
     */
    public static String timestamp2String(Timestamp timestamp){
    	if(timestamp== null){
    		return "";
    	}
        String tsStr = "";  
        DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
        try {  
            tsStr = sdf.format(timestamp);  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    	return tsStr;
    }
    
    /**
     * 将Timestamp转化为 String
     * @author huangjt<br/>
     * date 2013-5-21<br/>
     * @param timestamp
     * @return
     */
    public static String timestamp2String(Timestamp timestamp, String style){
    	if(timestamp== null){
    		return "";
    	}
        String tsStr = "";  
        DateFormat sdf = new SimpleDateFormat(style);  
        try {  
            tsStr = sdf.format(timestamp);  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    	return tsStr;
    }
    
    /**
     * 给定某日期，判断是星期几<br/>
     * date:2013-7-24 14:46:04<br/>
     * @param date 要查询的日期,格式必须为(yyyy-MM-dd HH:mm:ss)
     * @author huangjt
     * */
    public static String getWeekday(String date) {
    	SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    	SimpleDateFormat formatw = new SimpleDateFormat("E");
    	
    	Date d = null;
    	
    	try {
			d = format.parse(date);
		
    	} catch (ParseException e) {
			e.printStackTrace();
		}
		
    	String weekString  = formatw.format(d);
    	
    	return weekString;
    }
    
    /**
     * 获取星期的日期，以当周为基础,返回以yyyy-MM-dd格式的string类型的时间
     * @author huangjt<br/>
     * date 2013-7-24<br/>
     * @param weedDay	0代表本周，1代表下周，-1代表上周
     * @param day	传入周几，使用 Calendar.MONDAY
     * @return String yyyy-MM-dd
     */
    public static String getWeekDate(int weedDay, int day){
    	Calendar cal = Calendar.getInstance();
    	cal.add(Calendar.DATE, weedDay*7);
    	cal.set(Calendar.DAY_OF_WEEK,day);
    	return new SimpleDateFormat("yyyy-MM-dd").format(cal.getTime());
    }
    
    /**
     * 时间的添加<br/>
     * date:2013-8-5 17:40:04<br/>
     * @author huangjt
     * @param baseTime 基础时间字符串，格式为yyyy-MM-dd HH:mm:ss
     * @param secends 添加的毫秒数
     * @return String 添加后的时间字符串 ，格式为yyyy-MM-dd HH:mm:ss
     * @throws Exception 
     * */
    public static String addTime(String baseTime,long secends) throws Exception {
    	SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    	
    	Date baseDate = format.parse(baseTime);
    	long endSecends = baseDate.getTime() + secends;
    	
    	return format.format(endSecends);
    }
    
    /**
     * 两个时间相减<br/>
     * date:2013-8-6 14:37:01<br/>
     * @author huangjt
     * @param  largerTime 被减数  格式：yyyy-MM-dd HH:mm:ss
     * @param  lesserTime 减数  格式：yyyy-MM-dd HH:mm:ss
     * @return long 商
     * @throws Exception 
     * */
    public static long minusTime(String largerTime,String lesserTime) {
    	try {
    		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        	
        	Date largerDate = format.parse(largerTime);
        	Date lesserDate = format.parse(lesserTime);
        	return largerDate.getTime()-lesserDate.getTime();
		} catch (Exception e) {
			return 0;
		}
    }
   
    /**
     * 创建当前日期 yyyy-mm-dd 返回一个date类型
     * @author huangjt<br/>
     * date 2013-8-8<br/>
     * @return
     */
    public static Date createDateTime(){
    	Calendar c = Calendar.getInstance(); 
    	c.setTime(new Date());
    	//SimpleDateFormat  sdf = new SimpleDateFormat("yyyy-MM-dd");
    	return c.getTime();
    }
    
    /**
     * 计算两个时间的相隔天数
     * @author huangjt<br/>
     * date 2013-11-5<br/>
     * @param time1	格式yyyy-MM-dd
     * @param time2 格式yyyy-MM-dd
     * @return	返回相隔的天数
     */
    public static long getQuot(String time1, String time2){
    	long quot = 0;
    	SimpleDateFormat ft = new SimpleDateFormat("yyyy-MM-dd");
    	try {
    		Date date1 = ft.parse( time1 );
    		Date date2 = ft.parse( time2 );
    		quot = date1.getTime() - date2.getTime();
    		quot = quot / 1000 / 60 / 60 / 24;
    	} catch (ParseException e) {
    		e.printStackTrace();
    	}
    	return Math.abs(quot);
    }
    
    /**
     * 将string类型的时间转换成date格式, str格式为yyyy-MM-dd
     * @author huangjt
     * @param dateStr
     * @return
     * @throws ParseException 
     */
    public static Date String2Date(String dateStr) {
    	SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    	try {
			return sdf.parse(dateStr);
		} catch (ParseException e) {
			System.out.println("时间转换错误");
			return null;
		}
    }
    
	public static void main(String[] args) throws Exception {
		/*System.out.println(DateCreator.getNextDay(-30l));
		System.out.println(DateCreator.getNextDay(180l));*/
		
		//System.out.println(DateCreator.getNextDay("2014-07-12", 30l, "yyyy-MM-dd"));
		String[] strs = {"a", "b", "c"};
		System.out.println(strs);
	}
}
